﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ServiceLibrary.Model;
using ServiceLibrary.DLayer;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using System.Xml.Serialization;
using System.Globalization;
using System.IO;
using System.ServiceModel;
using System.Threading;
using System.Web;
using System.Runtime.Serialization;
using System.Data.SqlClient;
using System.Data.Objects;
using log4net;
using log4net.Config;
using System.Configuration;
using System.Diagnostics;
using System.Web.Hosting;
using System.Security.Permissions;
using System.ServiceModel.Activation;
using System.Security.Principal;
using System.ServiceModel.Channels;
using System.Xml.XPath;
using System.ComponentModel;
using ServiceLibrary.ServiceSISMws;


namespace ServiceLibrary.BLayer
{
    public class BSIO
    {
        #region IsAlive

        public bool IsAlive()
        {
            return true;
        }

        #endregion

        #region ScorriEventi()

        private static log4net.ILog log;


        public void ScorriEventi()
        {
            //SMRSRPClient client = null;
            sismwso2PortTypeClient client = null;
            //String ws_url = "http://tst-spjb601-sl01.self.csi.it:18010/sisminvi/services";
            String ws_url = "http://tst-wsbe.csi.it:80/wso001/services/sismwso2.sismwso2HttpSoap11Endpoint";
            //String ws_url = "http://localhost:808/wso001/services/sismwso2.sismwso2HttpSoap11Endpoint";
            string XSD_Location = @"SCHEMA\SISM.xsd";
            XPathNavigator nav;
            XPathDocument docNav;
            XPathNodeIterator NodeIter;
            BABELE_Entities context = new BABELE_Entities();
            SISM_EVENTI_MESSAGGI admTable = new SISM_EVENTI_MESSAGGI();


            IQueryable<SISM_EVENTI_MESSAGGI> tblSISM_EVENTI_MESSAGGI;
            IQueryable<SISM_EVENTI_MESSAGGI> resultset_SISM_EVENTI_MESSAGGI;
            try
            {
                #region LOG

                LOGHelp _logHelp = LOGHelp.Instance;
                _logHelp.LoadLog4NeFromCongif();
                log = log4net.LogManager.GetLogger("Servizio");

                #endregion
                log.Debug("START: *********public void ScorriEventi()*********");

                #region T_SQL: Leggo dalla tabella SISM_EVENTI_MESSASSI I RECORD CON "STATO" NULL

                tblSISM_EVENTI_MESSAGGI = from messaggi in context.SISM_EVENTI_MESSAGGI select messaggi;
                resultset_SISM_EVENTI_MESSAGGI = tblSISM_EVENTI_MESSAGGI.Where(messaggi => messaggi.STATO == null);

                string xml_out;


                foreach (var resMsg in resultset_SISM_EVENTI_MESSAGGI)
                {
                   
                    xml_out = resMsg.MESSAGIO_XML;
                    //todO CREO ISTANZA DELLe CLASSe DA INVIARE dall'xml letto dal db
                    StringReader rdr = new StringReader(xml_out);
                    // Open the XML.
                    //XmlReader myRead = XmlReader.Create(rdr);
                    docNav = new XPathDocument(rdr);



                    // Create a navigator to query with XPath.
                    nav = docNav.CreateNavigator();
                    if ("AT".Equals(resMsg.TIPO_INVIO))
                    {
                        try
                        {

                            //string xml = "<SetANAGT xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns='http://www.csi.it/SISM/'><Mittente xmlns=''><codiceMittente>codice</codiceMittente></Mittente><DatiAssistito xmlns=''><DatiAnagraficiAssistitiSenzaIdentificativo><Sesso>1</Sesso></DatiAnagraficiAssistitiSenzaIdentificativo></DatiAssistito></SetANAGT>";
                            string xml = nav.OuterXml;
                            object obj_anagTElement = Function.DeserializeFromXmlString(xml, typeof(AnagtType));
                            AnagtType anagTElement = (AnagtType)obj_anagTElement;

                            //bool xsdValid = Function.Validate(Guid.NewGuid().ToString(), anagTElement, XSD_Location);
                            //invoco il servizio
                            resMsg.STATO = 2;//Invio effettuato ma errore avvenuto durante l'invocazione 
                            //client = new SMRSRPClient();
                            client = new sismwso2PortTypeClient();

                            //wso2 
                            client.Endpoint.Address = new EndpointAddress(ws_url);

                            //client.Echo("ciao");

                            //string  p = client.SetANAGT(anagTElement.Mittente, anagTElement.DatiIdentificativiScheda, anagTElement.TipoMovimento, anagTElement.DatiAssistitoElement, anagTElement.TipoFlusso);
                            //ResponseType p = client.SetANAGT(anagTElement.Mittente, anagTElement.DatiIdentificativiScheda, anagTElement.TipoMovimento, anagTElement.DatiAssistitoElement, anagTElement.TipoFlusso);
                            int p = client.SetANAGT(anagTElement);
                            //int p = client.SetANAGT(anagTElement.Mittente, anagTElement.DatiIdentificativiScheda, anagTElement.TipoMovimento, anagTElement.DatiAssistitoElement, anagTElement.TipoFlusso);
                            log.Debug("*********public void ScorriEventi() SetANAGT********* wso2 uid=" + p);
                            // Salvi sulla tabella Mssaggi id e lo fleggo come  inviato
                            resMsg.WSUID = p;
                            resMsg.MESSAGGO_ERRORE = "";
                            resMsg.STATO = 1;//Invio effettuato esito ok
                        }
                        catch (SqlException exSql)
                        {
                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio SetANAGT:" + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString());
                            log.Error("ERROR Type SqlExcetion 2: " + resMsg.MESSAGGO_ERRORE);
                            break;
                        }
                        catch (Exception ex)
                        {

                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio:" + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString());
                            throw new System.Exception(resMsg.MESSAGGO_ERRORE);
                        }
                    }
                    else if ("AR".Equals(resMsg.TIPO_INVIO))
                    {
                        try
                        {
                            string xml = nav.OuterXml;
                            object obj_anagrs = Function.DeserializeFromXmlString(xml, typeof(AnagRSType));
                            AnagRSType anagrs = (AnagRSType)obj_anagrs;

                            client = new sismwso2PortTypeClient();
                            //wso2 prelevarlo da db TODO
                            client.Endpoint.Address = new EndpointAddress(ws_url);
                            int uid = client.SetANAGRS(anagrs);
                            log.Debug("*********public void ScorriEventi() SetANAGRS********* wso2 uid=" + uid);
                            // Salvo sulla tabella Mssaggi id e fleggo come inviato
                            resMsg.WSUID = uid;
                            resMsg.MESSAGGO_ERRORE = "";
                            resMsg.STATO = 1;//Invio effettuato esito ok
                        }
                        catch (SqlException exSql)
                        {
                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio SetANAGRS:" + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString());
                            log.Error("ERROR Type SqlExcetion 2: " + resMsg.MESSAGGO_ERRORE);
                            break;
                        }
                        catch (Exception ex)
                        {

                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio SetANAGRS:" + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString());
                            throw new System.Exception(resMsg.MESSAGGO_ERRORE);
                        }
                    }
                    else if ("CT".Equals(resMsg.TIPO_INVIO))
                    {
                        try
                        {
                            string xml = nav.OuterXml;
                            object obj_contt = Function.DeserializeFromXmlString(xml, typeof(ContTType));
                            ContTType contt = (ContTType)obj_contt;

                            client = new sismwso2PortTypeClient();
                            //wso2 prelevarlo da db TODO
                            client.Endpoint.Address = new EndpointAddress(ws_url);
                            int uid = client.SetCONTT(contt);
                            log.Debug("*********public void ScorriEventi() SetCONTT********* wso2 uid=" + uid);
                            // Salvo sulla tabella Mssaggi id e fleggo come inviato
                            resMsg.WSUID = uid;
                            resMsg.MESSAGGO_ERRORE = "";
                            resMsg.STATO = 1;//Invio effettuato esito ok
                        }
                        catch (SqlException exSql)
                        {
                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio SetCONTT:" + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString());
                            log.Error("ERROR Type SqlExcetion 2: " + resMsg.MESSAGGO_ERRORE);
                            break;
                        }
                        catch (Exception ex)
                        {

                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio:" + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString());
                            throw new System.Exception(resMsg.MESSAGGO_ERRORE);
                        }
                    }
                    else if ("CR".Equals(resMsg.TIPO_INVIO))
                    {
                        try
                        {
                            string xml = nav.OuterXml;
                            object obj_contrs = Function.DeserializeFromXmlString(xml, typeof(ContRSType));
                            ContRSType contrs = (ContRSType)obj_contrs;

                            client = new sismwso2PortTypeClient();
                            //wso2 prelevarlo da db TODO
                            client.Endpoint.Address = new EndpointAddress(ws_url);
                            int uid = client.SetCONTRS(contrs);
                            log.Debug("*********public void ScorriEventi() SetCONTRS********* wso2 uid=" + uid);
                            // Salvo sulla tabella Mssaggi id e fleggo come inviato
                            resMsg.WSUID = uid;
                            resMsg.MESSAGGO_ERRORE = "";
                            resMsg.STATO = 1;//Invio effettuato esito ok
                        }
                        catch (SqlException exSql)
                        {
                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio SetCONTRS:" + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString());
                            log.Error("ERROR Type SqlExcetion 2: " + resMsg.MESSAGGO_ERRORE);
                            break;
                        }
                        catch (Exception ex)
                        {

                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio:" + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString());
                            throw new System.Exception(resMsg.MESSAGGO_ERRORE);
                        }
                    } else if ("PT".Equals(resMsg.TIPO_INVIO))
                    {
                        try
                        {
                            string xml = nav.OuterXml;
                            object obj_prestt = Function.DeserializeFromXmlString(xml, typeof(PrestTType));
                            PrestTType prestt = (PrestTType)obj_prestt;

                            string xml_2 = Function.SerializeToXmlString(obj_prestt);

                            //compareXml(xml,xml_2);
                            

                            client = new sismwso2PortTypeClient();
                            //wso2 prelevarlo da db TODO
                            client.Endpoint.Address = new EndpointAddress(ws_url);
                            int uid = client.SetPRESTT (prestt);
                            log.Debug("*********public void ScorriEventi() SetPRESTT********* wso2 uid=" + uid);
                            // Salvo sulla tabella Mssaggi id e fleggo come inviato
                            resMsg.WSUID = uid;
                            resMsg.MESSAGGO_ERRORE = "";
                            resMsg.STATO = 1;//Invio effettuato esito ok
                        }
                        catch (SqlException exSql)
                        {
                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio SetPRESTT:" + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString());
                            log.Error("ERROR Type SqlExcetion 2: " + resMsg.MESSAGGO_ERRORE);
                            break;
                        }
                        catch (Exception ex)
                        {

                            resMsg.MESSAGGO_ERRORE = "Errore durante l'invio:" + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString());
                            throw new System.Exception(resMsg.MESSAGGO_ERRORE);
                        }
                    }


                }


                #endregion
            }
            catch (SqlException exSql)
            {
                log.Error("ERROR Type SqlExcetion: " + ((exSql.InnerException != null) ? exSql.InnerException.ToString() : exSql.Message.ToString()));

            }
            catch (Exception ex)
            {

                log.Error("ERROR Type Excetion: " + (ex.InnerException != null ? ex.InnerException.ToString() : ex.Message.ToString()));
            }
            finally
            {
                context.SaveChanges();

                log.Debug("STOP: *********public bool ScorriEventi()*********");
            }
        }
        #endregion

        public void Test()
        {

            string xml = "<tns:AnagTElement xmlns:tns='http://www.csi.it/sisminvi/'><tns:Mittente xmlns:tns='http://www.csi.it/sisminvi/'><tns:codiceMittente>152</tns:codiceMittente></tns:Mittente><tns:DatiIdentificativiScheda xmlns:tns='http://www.csi.it/sisminvi/'><tns:AnnoDiRiferimento>2014</tns:AnnoDiRiferimento><tns:CodiceRegione>010</tns:CodiceRegione><tns:PeriodoDiRiferimento>S1</tns:PeriodoDiRiferimento><tns:CodiceAziendaSanitariaDiRiferimento>202</tns:CodiceAziendaSanitariaDiRiferimento><tns:codiceDipartimentoSaluteMentale>D01</tns:codiceDipartimentoSaluteMentale></tns:DatiIdentificativiScheda><tns:TipoMovimento xmlns:tns='http://www.csi.it/sisminvi/'>I</tns:TipoMovimento><tns:DatiAssistitoElement><tns:DatiAssistito xmlns:tns='http://www.csi.it/sisminvi/'><tns:IdentificativoAURA>2040324</tns:IdentificativoAURA><tns:TitoloDiStudio /><tns:CodiceProfessionale /><tns:CollocazioneSocioAmbientale /><tns:StatoCivile /></tns:DatiAssistito></tns:DatiAssistitoElement><tns:TipoFlusso xmlns:tns='http://www.csi.it/sisminvi/'>AT</tns:TipoFlusso></tns:AnagTElement>";
            string XSD_Location = @"SCHEMA\SISM.xsd";
            object obj_a = Function.DeserializeFromXmlString(xml, typeof(AnagtType));
            AnagtType _a = (AnagtType)obj_a;

            bool xsdValid = Function.Validate(Guid.NewGuid().ToString(), _a, XSD_Location);
        }

        private bool compareXml(string xml_1, string xml_2)
        {
            xml_2 = "<book xmlns:bk='urn:samples'></book>";
            XmlDocument doc1 = new XmlDocument();
            XmlDocument doc2 = new XmlDocument();
            doc1.Load(new StringReader(xml_1));
            doc2.LoadXml(xml_2);


            XDocument aDoc = XDocument.Load(new XmlNodeReader(doc1));
            XDocument bDoc = XDocument.Load(new XmlNodeReader(doc2));
            var dffina = aDoc.Descendants("Project").Except(bDoc.Descendants("Project"));
            return true;
            
        }
    }
}
